Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

293
Visualizações
¿Qué es la inspección "Agregar atributo #[Puro]" en la comprobación de PhpStorm?

Tengo una clase FormRequest muy simple en un proyecto de Laravel. Dos métodos, los cuales devuelven una matriz simple que está parcialmente poblada por un método, pero el IDE los trata de manera diferente.

 <?php namespace App\Http\Requests; class VerifyPhoneNumber extends FormRequest { use Support\ValidatesPhoneNumbers; public function authorize(): bool { return true; } public function rules(): array { return [ "phone_number" => $this->getPhoneNumberRules(), "verify_code" => ["required", "numeric", "max:999999"], ]; } public function messages(): array { return [ "phone_number.regex" => $this->getPhoneNumberMessage(), ]; } }

Y los métodos de rasgos muy básicos:

 <?php namespace App\Http\Requests\Support; trait ValidatesPhoneNumbers { protected function getPhoneNumberMessage(): string { return __("Some localized error message"); } protected function getPhoneNumberRules(): array { return ["regex:/^\+?1?[2-9][0-9]{5,14}$/", "max:16"]; } }

Lo que me desconcierta es que la inspección del IDE se queja de que debería agregar el atributo JetBrains\PhpStorm\Pure al método rules() , pero no al método de messages() .

Los comentarios en la definición de clase dicen:

El atributo marca la función que no tiene impacto en el estado del programa o los parámetros pasados utilizados después de la ejecución de la función. Esto significa que una llamada de función que se resuelve en dicha función se puede eliminar de forma segura si el resultado de la ejecución no se usa en el código posteriormente.

Eso realmente no me da ninguna pista de por qué trata estos dos métodos de manera diferente. Si entiendo la segunda oración correctamente, cuando el resultado de un método "puro" no se usa, el IDE marcará el uso del método como no usado y recomendará su eliminación.

¿Cuál es la lógica utilizada para determinar cuándo se necesita este atributo?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

El método rules() tiene un resultado fijo (mejor dicho "sin efectos secundarios" ): solo usa valores fijos. Claro, llama a getPhoneNumberRules() desde un rasgo pero también devuelve una matriz fija (siempre la misma). No realiza cambios en ningún otro lugar (estado interno o almacenamiento externo).

El método de messages() llama a un método de un rasgo que llama a __() para obtener un mensaje traducido... que puede provenir de una fuente diferente (una base de datos, un archivo) y, por lo tanto, potencialmente puede generar excepciones si un almacenamiento (archivo/base de datos ) no es legible. El IDE no sabe con certeza si __() realiza cambios en un archivo/base de datos; no está anotado como puro y PhpStorm no puede tomar tal decisión a partir de los métodos que utiliza.


PD : si esta inspección le molesta (lo que puedo entender), le sugiero que simplemente la ignore y reduzca su gravedad en Configuración de PhpStorm a "Sin resaltar, solo corregir" ( Settings (Preferences on macOS) | Editor | Inspections | PHP | Attributes | '#[Pure]' attribute can be added )

over 4 years ago · Santiago Trujillo Relatório

0

Si una función solo depende de otras funciones puras, entonces también es pura. Dado que getPhoneNumberRules() solo devuelve una matriz fija, es puro, por lo que rules() también es puro.

Pero messages() llama a getPhoneNumberMessage() , que llama a la función __() que puede devolver un mensaje localizado diferente si cambia el estado de la ubicación, por lo que no es puro.

over 4 years ago · Santiago Trujillo Relatório

0

Utilice este atributo para funciones que no produzcan efectos secundarios. Todas estas funciones internas de PHP ya están marcadas en PhpStorm.

 #[Pure] function compare(Foo $a, Foo $b): int { return $a->a <=> $b->b; }

Fuente: https://github.com/JetBrains/phpstorm-attributes#pure

Como esta función solo hace algo por sí misma, se la puede llamar función #[Pura] y eso lo sabes a través de PhpStorm.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda